Объявление функции в .h файле:
#define LT_LINE 1
#define LT_RAY 2
#define LT_SEGMENT 3
bool FindLinesIntersect(CVertex A1, CVertex A2, unsigned ALineType,
CVertex B1, CVertex B2, unsigned BLineType,
CVertex* Result);
Описаниее в .cpp файле:
bool FindLinesIntersect(CVertex A1, CVertex A2, unsigned ALineType,
CVertex B1, CVertex B2, unsigned BLineType,
CVertex* Result)
{
//Проверка на принадлежность одной плоскости
CPlane pl(A1, A2, B2);
if (!B1.IsInPlane(pl)) return false;
float D = (A2.y-A1.y)*(B1.x-B2.x)-(B1.y-B2.y)*(A2.x-A1.x);
float U1= (A2.y-A1.y)*(B1.x-A1.x)-(B1.y-A1.y)*(A2.x-A1.x);
float U2= (B1.y-A1.y)*(B1.x-B2.x)-(B1.y-B2.y)*(B1.x-A1.x);
float p1, p2;
if(D!=0)
{
p1=U1/D;
p2=U2/D;
bool check1 = false;
bool check2 = false;
if (ALineType==LT_LINE) check1 = true;
if (BLineType==LT_LINE) check2 = true;
if (ALineType==LT_RAY && p2>=0)
check1 = true;
if (BLineType==LT_RAY && p1>=0)
check2 = true;
if (ALineType==LT_SEGMENT && p2>=0 && p2<=1)
check1 = true;
if (BLineType==LT_SEGMENT && p1>=0 && p1<=1)
check2 = true;
if(check1 && check2)
{
Result->x=A1.x+(A2.x-A1.x)*p2;
Result->y=A1.y+(A2.y-A1.y)*p2;
Result->z=A1.z+(A2.z-A1.z)*p2;
return true;
}
else
{
return false; //Parallel
}
}
else
{
return false;
}
}
В классе CVertex добавляем функции для определения расстояния до линии и проверку принадлежности
точки этой линии:
float CVertex::DistanceTo(const CVertex& V1,
const CVertex& V2) const //Distance to line
{
const float a = this->DistanceTo(V1);
const float b = this->DistanceTo(V2);
const float c = V2.DistanceTo(V1);
const float p = (a+b+c)/2;
return (float)(2/c*sqrt(p*(p-a)*(p-b)*(p-c)));
}
bool CVertex::IsOnLine(const CVertex& V1,
const CVertex& V2, unsigned LineType)const
{
CVector Dir(V1, V2);
CVector Ver(V1, *this);
CVector DirN = Dir.GetNormalized();
CVector VerN = Ver.GetNormalized();
if (DirN == VerN) //Same Direction
{
if (LineType == LT_LINE || LineType == LT_RAY)
return true;
else if (Dir.Magnitude() > Ver.Magnitude())
return true;
else
return false;
}
else if (DirN == -VerN && LineType == LT_LINE)
return true;
else
return false;
}
Файл со всеми классами геометрических операций можно найти, например, в главе
шаблоны для OpenGL.